package trabalho.das.fxml.views.controladores;

import builders.BuilderDeTelha;
import comandos.ComandoCriarTelha;
import entidades.DesenhoDinamico;
import entidades.Estilo;
import entidades.Familia;
import entidades.Ponto;
import entidades.Rectangulo;
import entidades.Telha;
import entidades.util.RandomString;
import java.io.File;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.beans.value.ObservableValue;
import javafx.embed.swing.SwingFXUtils;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.canvas.Canvas;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;
import javafx.scene.image.WritableImage;
import javafx.stage.Stage;
import javax.imageio.ImageIO;
import sistema.ISistema;
import sistema.Sistema;

/**
 * FXML Controller class
 *
 * @author davidrex
 */
public class ControladorCriarTelha implements Initializable {

    private final BuilderDeTelha builder = new BuilderDeTelha();

    @FXML
    private Canvas menuTelhaCanvas;

    @FXML
    private ComboBox<Estilo> criarTelhaMenuEstilos;

    @FXML
    private ComboBox<Familia> criarTelhaMenuFamilias;

    @FXML
    private TextField tipoTelhaField;

    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        criarTelhaMenuFamilias.setStyle("-fx-border-color: red;-fx-border-width: 2;");
        criarTelhaMenuEstilos.setStyle("-fx-border-color: red;-fx-border-width: 2;");

        criarTelhaMenuFamilias.getItems().addAll(Sistema.getInstance().getFamilias().values());

        criarTelhaMenuFamilias.focusedProperty().addListener(
                (ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue) -> {
                    Familia selectedItem = criarTelhaMenuFamilias.getSelectionModel().getSelectedItem();
                    if (selectedItem == null) {
                        criarTelhaMenuFamilias.setStyle("-fx-border-color: red;-fx-border-width: 2;");
                    } else {
                        criarTelhaMenuFamilias.setStyle("-fx-border-color: green;-fx-border-width: 2;");
                        criarTelhaMenuEstilos.getSelectionModel().clearSelection();
                        criarTelhaMenuEstilos.getItems().clear();
                        criarTelhaMenuEstilos.getItems().addAll(Sistema.getInstance().getTodosEstilosDaFamilia(selectedItem));
                    }
                });

        criarTelhaMenuEstilos.focusedProperty().addListener(
                (ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue) -> {
                    Estilo selectedItem = criarTelhaMenuEstilos.getSelectionModel().getSelectedItem();
                    if (selectedItem == null) {
                        criarTelhaMenuEstilos.setStyle("-fx-border-color: red;-fx-border-width: 2;");
                    } else {
                        criarTelhaMenuEstilos.setStyle("-fx-border-color: green;-fx-border-width: 2;");
                    }
                });

    }

    @FXML
    private void criarTelhaGuardarTelhaAction(ActionEvent event) {
        String textNomeEstilo = tipoTelhaField.getText();
        Estilo selectedEstilo = criarTelhaMenuEstilos.getSelectionModel().getSelectedItem();
        Familia selectedFamilia = criarTelhaMenuFamilias.getSelectionModel().getSelectedItem();
        if (textNomeEstilo == null || textNomeEstilo.isEmpty()) {
            System.out.println("textNomeEstilo == null || nomeEstilo == 0");
            tipoTelhaField.setStyle("-fx-border-color: red;-fx-border-width: 2;");
            return;
        }
        if (selectedEstilo == null) {
            System.out.println("selectedEstilo == null");
            criarTelhaMenuEstilos.setStyle("-fx-border-color: red;-fx-border-width: 2;");
            return;
        }
        if (selectedFamilia == null) {
            System.out.println("selectedFamilia == null");
            criarTelhaMenuFamilias.setStyle("-fx-border-color: red;-fx-border-width: 2;");
            return;
        }
        
        ISistema sistema = Sistema.getInstance();
        
        String imagem = "desenhos/" + RandomString.obterString(10) + ".png";
        File f = new File(imagem);
        
        if(toImage(f)) {
            builder.setDesenhoDinamico(new DesenhoDinamico(0, imagem));
            builder.setEstilo(selectedEstilo);
            builder.setFamilia(selectedFamilia);
            builder.setTipoDeTelha(sistema.getTipoDeTelha(textNomeEstilo));
            builder.setRectangulo(new Rectangulo(new Ponto(0f, 0f), 30f, 30f, Telha.MIN_SIZE));

            if (builder.estaPronto()) {
                ComandoCriarTelha comando = new ComandoCriarTelha(builder.construirEstilo());
                sistema.getGestorComandos().executeComando(comando);
                ((Stage) tipoTelhaField.getScene().getWindow()).close();
            }
        }
    }

    @FXML
    private void criarTelhasCancelarAction(ActionEvent event) {
        ((Stage) tipoTelhaField.getScene().getWindow()).close();
    }
    
    public boolean toImage(File file) {
        WritableImage wim = new WritableImage((int)menuTelhaCanvas.getWidth(), (int)menuTelhaCanvas.getHeight());
        menuTelhaCanvas.snapshot(null, wim);
        try {
            ImageIO.write(SwingFXUtils.fromFXImage(wim, null), "png", file);
            return true;
        } catch (Exception s) {
            System.out.println(s);
            return false;
        }
    }

}
